home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 49
/
Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso
/
-serious-
/
comms
/
other
/
novia
/
src
/
novia_mail.c
< prev
next >
Wrap
Text File
|
1999-12-06
|
16KB
|
623 lines
#include <stdlib.h>
#include <pragma/exec_lib.h>
#include <pragma/dos_lib.h>
#include <novia/novia_UserList.h>
#include <novia/novia_PortData.h>
#include <novia/novia_config.h>
#include <novia/novia_vde.h>
#include <novia/novia_mail.h>
#include <novia/novia_subboard.h>
#include <novia/novia_types.h>
#include <novia/novia_misc.h>
#include <novia/novia_message.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <time.h>
#include <novia/novia_funcs.h>
#include <pragma/noviasys_lib.h>
#define PORTTYPE_MAIN 1
#define PORTTYPE_CLIENT 0
void SaveMail(long UserID,long MailID);
void MailVerify(long UserID);
void AddMail(long UserID);
void ShowMail(long UserID,long MailID);
void ReadSubboard(struct Item *item,char *path);
void SaveMail(long UserID,long MailID)
{
}
void MailVerify(long UserID)
{
struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
if (cport)
{
BPTR mulder;
char buffer[200],Quit=FALSE,y;
char filename[50];
char username[100];
char subject[100];
char counter,rebuild=TRUE,lastMail=FALSE;
char nostdcmd;
long entrys=0,MailID=1,result;
ULONG cmdid;
sprintf(filename,"%s%d/MailHead",cport->sysdirs->userdir,UserID);
mulder=Open(filename,MODE_OLDFILE);
if (mulder)
{
Read(mulder,&entrys,4);
Close(mulder);
}
CLS();
while (Quit==FALSE && !cport->ProgramClose && cport->network.online)
{
if (rebuild==TRUE)
{
LF();
if (entrys)
{
for (counter=0;(counter+MailID<=entrys && counter<20 && rebuild==TRUE);counter++)
{
mulder=Open(filename,MODE_OLDFILE);
if (mulder)
{
Seek(mulder,((counter+MailID-1)*(sizeof(Mail)))+84,OFFSET_BEGINNING);
Read(mulder,subject,80);
Read(mulder,username,80);
sprintf(buffer,"
%4d
%20s
%s",counter+MailID,username,subject);
LF();Writeio(buffer,-1);
Close(mulder);
}
}
}
else
ioprintf("Mailbox is empty.\n");
LF();
rebuild=FALSE;
}
LF();Writeio("Quit, Scan, Edit, Read # :> ",-1);
Getstring(buffer,0,50,BUFFERED,0);
StrToLong(buffer,&result);
GetArg(buffer);
nostdcmd=TRUE;
switch ((cmdid=GetCommandID(cport->argstring[0])))
{
case CMD_QUIT:
Quit=TRUE;
nostdcmd=FALSE;
break;
case CMD_SAVE:
Getlong((ULONG *)&result,0,50,0,0);
if (result>0 && result<=entrys)
{
if (result>0 && result<=entrys)
{
MailID=result;
rebuild=TRUE;
}
if (result<0)
{
if ((MailID+result)>0)MailID=MailID+result;
else MailID=1;
rebuild=TRUE;
}
}
nostdcmd=FALSE;
break;
case CMD_KILL: case CMD_DEL:
nostdcmd=FALSE;
break;
}
if (nostdcmd)
{
if (!cmdid)
{
if (result)
{
ioprintf("result: %d\n",result);
if (result<=entrys)
{
MailID=result;
CLS();ShowMail(UserID,MailID);
if (MailID<entrys)
{
MailID++;
lastMail=FALSE;
}
else
lastMail=TRUE;
}
else
ioprintf("c3invalid item c7%d.\n",result);
}
else
{
if (*cport->argstring[0]=='0')
{
ioprintf("c3invalid item c7%d.\n",result);
}
else
{
if (strlen(cport->argstring[0])==0)
{
if (lastMail==FALSE)
{
CLS();ShowMail(UserID,MailID);
if (MailID<entrys)
{
MailID++;
lastMail=FALSE;
}
else
lastMail=TRUE;
}
else
ioprintf("\nNo more Mails!\n");
}
else
ioprintf("\n%s: Unknown command\n",cport->argstring[0]);
}
}
}
else
{
if (!StdCommand(cmdid));
ioprintf("\n%s: Unknown command\n",cport->argstring[0]);
}
}
}
}
}
void AddMail(long UserID)
{
struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
if (cport)
{
Mail brief;
LONG size;
APTR init;
BPTR mulder=NULL;
BPTR mulder2=NULL;
char *text,bool,Quit,buffer[80];
long touser=0;
VisualEditor("");
LF();Writeio("if you are finish with writing, then press return",-1);
WaitKey(0);
mulder=Open("ram:text",MODE_OLDFILE);
if (mulder==0)return;
brief.IPNumber=cport->LocalUser.IDNumber;
brief.FromUser=cport->LocalUser.IDNumber;
brief.MailType=MAILTYPE_NOVIA;
strcpy(brief.From,cport->LocalUser.Handle);
strcpy(brief.FromRealName,cport->LocalUser.RealName);
LF();Writeio("
From :
",-1);
Writeio(brief.From,-1);
while (touser==0)
{
LF();Writeio("
To :
",-1);
Getstring(buffer,0,50,0,0);
touser=SearchUser(buffer);
}
LoadUser(&cport->EditUser,touser);
strcpy(brief.To,cport->EditUser.Handle);
strcpy(brief.ToRealName,cport->EditUser.RealName);
brief.ToUser=touser;
LF();Writeio("
Subject :
",-1);
Getstring(buffer,0,50,0,0);
strcpy(brief.Subject,buffer);
LF();Writeio("Do you write anonymous ? [No]",-1);
if (Yesno(FALSE,0)==TRUE)
{
Quit=FALSE;
while (!Quit && !cport->ProgramClose && cport->network.online)
{
LF();Writeio("
Alias :
",-1);
Getstring(buffer,0,50,0,0);
if (strlen(buffer)>0)Quit=TRUE;
}
strcpy(brief.Alias,buffer);
brief.AnonymousMail=TRUE;
}
else
{
brief.AnonymousMail=FALSE;
brief.Alias[0]=0;
brief.AnonymousMail=0;
}
brief.NoEdit=0;
brief.MailListMail=0;
brief.Receipt=0;
brief.Return=0;
brief.FileMail=0;
brief.Copy=0;
brief.LogMail=0;
brief.LogID=0;
brief.MailListID=0;
brief.ForwardEntrys=0;
brief.first_Forward=0;
brief.last_Forward=0;
Seek(mulder,0,OFFSET_END);
brief.length=Seek(mulder,0,OFFSET_END);
if (brief.length==0)return;
sprintf(buffer,"%s%d/MailData",cport->sysdirs->userdir,touser);
mulder2=Open(buffer,MODE_READWRITE);
if (mulder2==0)
{
mulder2=Open(buffer,MODE_NEWFILE);
if (mulder2==0)return;
brief.Seek=0;
}
else
{
Seek(mulder2,0,OFFSET_END);
brief.Seek=Seek(mulder2,0,OFFSET_END);
}
text=AllocVec(brief.length,MEMF_ANY);
if (text==0)
{
Close(mulder);
Close(mulder2);
return;
}
Seek(mulder,0,OFFSET_BEGINNING);
Read(mulder,text,brief.length);
Close(mulder);
Write(mulder2,text,brief.length);
Close(mulder2);
FreeVec(text);
sprintf(buffer,"%s%d/MailHead",cport->sysdirs->userdir,touser);
mulder=Open(buffer,MODE_READWRITE);
if (mulder==NULL)
{
mulder=Open(buffer,MODE_NEWFILE);
if (mulder==NULL)return;
init=AllocVec(20,MEMF_ANY|MEMF_CLEAR);
if (init==0)
{
Close(mulder);
return;
}
Write(mulder,init,20);
FreeVec(init);
}
else
{
Seek(mulder,0,OFFSET_END);
if (Seek(mulder,0,OFFSET_END)>=20)
{
Seek(mulder,0,OFFSET_BEGINNING);
Read(mulder,&brief.IDNumber,4);
brief.IDNumber++;
}
else
{
brief.IDNumber=1;
init=AllocVec(20,MEMF_ANY|MEMF_CLEAR);
if (init==0)
{
Close(mulder);
return;
}
Seek(mulder,0,OFFSET_BEGINNING);
Write(mulder,init,20);
FreeVec(init);
}
}
Seek(mulder,0,OFFSET_BEGINNING);
Write(mulder,&brief.IDNumber,4);
Seek(mulder,20+((brief.IDNumber-1)*sizeof(Mail)),OFFSET_BEGINNING);
Write(mulder,&brief,sizeof(Mail));
Close(mulder);
}
}
void ShowMail(long UserID,long MailID)
{
struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
if (cport)
{
Mail brief;
long items;
char buffer[200];
BPTR mulder;
BOOL flag=FALSE;
sprintf(buffer,"%s%d/MailHead",cport->sysdirs->userdir,UserID);
mulder=Open(buffer,MODE_OLDFILE);
if (mulder==NULL)return;
Seek(mulder,0,OFFSET_END);
if (Seek(mulder,0,OFFSET_END)<(sizeof(Mail)*MailID))
{
Close(mulder);
return;
}
Seek(mulder,0,OFFSET_BEGINNING);
Read(mulder,&items,4);
Seek(mulder,20+((MailID-1)*sizeof(Mail)),OFFSET_BEGINNING);
Read(mulder,&brief,sizeof(Mail));
Close(mulder);
if (brief.MailType==MAILTYPE_NOVIA)LoadUser(&cport->EditUser,brief.FromUser);
ioprintf("z4c7Item :z0c3 (%d of %d) - c2SerialID: %010d.%010d\n",MailID,items,brief.IDNumber,brief.IPNumber);
ioprintf("z4c7Subject :z0c7 %s\n",brief.Subject);
ioprintf("z4c7From :z0c3 ");
if (cport->LocalUser.Flag_trace_anounym==TRUE | cport->LocalUser.Flag_supervisor==TRUE)flag=TRUE;
if (brief.AnonymousMail==TRUE)
{
if (flag==TRUE)Writeio("
",-1);
Writeio(brief.Alias,-1);
if (flag==TRUE)Writeio("
",-1);
}
if (brief.AnonymousMail==FALSE | flag==TRUE)
{
Writeio("
",-1);
Writeio(brief.From,-1);
if (brief.MailType==MAILTYPE_NOVIA)
{
Writeio(" (",2);
Writelong(brief.FromUser);
}
if (cport->EditUser.PRealName==FALSE | cport->LocalUser.Flag_supervisor==TRUE | brief.MailType!=MAILTYPE_NOVIA)
{
Writeio(", ",2);
Writeio(brief.FromRealName,-1);
}
}
Writeio(")",2);
LF();
Writeio("
To :
",-1);
Writeio(brief.To,-1);
if (brief.ToUser>0)
{
Writeio(", ",-1);
Writelong(brief.ToUser);
if (brief.MailType==MAILTYPE_NOVIA)
{
Writeio(", ",2);
Writelong(brief.FromUser);
}
}
LF();
ioprintf("
Send :
00:00\n");
ioprintf("
Received:
00:00\n");
LF();
sprintf(buffer,"%s%d/MailData",cport->sysdirs->userdir,UserID);
ShowPart(buffer,brief.Seek,brief.length);
LF();
}
}
void ReadSubboard(struct Item *item,char *path)
{
struct PortData *cport=(PortData *)FindTask(NULL)->tc_UserData;
if (cport)
{
BPTR data_mulder=NULL;
BPTR index_mulder=NULL;
char buffer[256];
struct Reply *reply=NULL;
char quit=FALSE;
char readnew=TRUE;
ULONG ulong=0;
ULONG cmdid=0;
ULONG maxreplys=0;
ULONG replycounter=0;
LONG currentreply=0;
char nostdcmd=TRUE;
char readmore=TRUE;
char *buffer2;
char *select=AllocVec(item->replys,MEMF_ANY|MEMF_CLEAR);
do
{
if (readnew)
{
sprintf(buffer,"%s/data/%s.replys",path,item->itemheader.Path);
if (index_mulder=Open(buffer,MODE_OLDFILE))
{
Seek(index_mulder,0,OFFSET_END);
if (ulong=Seek(index_mulder,0,OFFSET_BEGINNING)/sizeof(Reply))
{
if (ulong+1>maxreplys)
{
if (reply)FreeVec(reply);
replycounter=ulong;
if (reply=AllocVec((replycounter+10)*sizeof(Reply),MEMF_ANY))
{
maxreplys=replycounter+10;
}
else
{
maxreplys=0;
replycounter=0;
ioprintf("\nCan't alloc mem for replystructure");
quit=TRUE;
}
}
if (reply)Read(index_mulder,reply,ulong*sizeof(Reply));
}
else
{
ioprintf("no more items\n");
}
Close(index_mulder);
}
readnew=FALSE;
}
if (readmore)
{
CLS();
if (!currentreply)
{
ioprintf("\nz4c7Item :z0c3 (%d, %d replys) - c2SerialID: %05d.%05d.00001\n",item->itemheader.IDNumber,item->replys+1,item->DirIP,item->itemheader.IPNumber);
ioprintf("z4c7Subject :z0c7 %s\n",item->itemheader.Title);
ioprintf("z4c7From :z0c3 %s (%u)\n",item->From,item->FromUser);
ioprintf("z4c7To :z0c3 %s (%u)\n",item->To,item->ToUser);
DateToString(buffer,&item->itemheader.LastChange,0);
ioprintf("z4c7on :z0c3 %s\n",buffer);
sprintf(buffer,"%s/data/%s.text",path,item->itemheader.Path);
ShowPart(buffer,item->seek,item->length);
}
else
{
ioprintf("\nz4c7Reply :z0c3 (%d of %d) - c2SerialID: %05d.%05d.%05d\n",currentreply+1,item->replys+1,item->DirIP,item->itemheader.IPNumber,currentreply+1);
ioprintf("z4c7From :z0c3 %s (%u)\n",reply[currentreply-1].From,reply[currentreply-1].FromUser);
ioprintf("z4c7To :z0c3 %s (%u)\n",reply[currentreply-1].To,reply[currentreply-1].ToUser);
DateToString(buffer,&reply[currentreply-1].LastChange,0);
ioprintf("z4c7on :z0c3 %s\n",buffer);
sprintf(buffer,"%s/data/%s.text",path,item->itemheader.Path);
ShowPart(buffer,reply[currentreply-1].seek,reply[currentreply-1].length);
}
readmore=FALSE;
}
ioprintf("\ncmd:>");
Getstring(buffer,0,50,BUFFERED,0);
GetArg(buffer);
cmdid=GetCommandID(cport->argstring[0]);
nostdcmd=TRUE;
if (!cmdid)
{
if (currentreply<replycounter)
{
currentreply++;
readmore=TRUE;
}
else
quit=TRUE;
}
else
switch(cmdid)
{
case CMD_QUIT: case CMD_PARRENT:
quit=TRUE;
nostdcmd=FALSE;
break;
case CMD_REPLY:
ioprintf("reply\n");
if (replycounter+1>maxreplys)
{
if (reply)FreeVec(reply);
if (reply=AllocVec((replycounter+10)*sizeof(Reply),MEMF_ANY))
{
ioprintf("reply1\n");
maxreplys=replycounter+10;
}
else
{
ioprintf("\nCan't alloc mem for replystructure");
quit=TRUE;
}
}
ioprintf("replycounter %d, maxreplys: %d",replycounter,maxreplys);
if (replycounter+1<maxreplys)
{
ioprintf("reply2\n");
ClearMemQuick(&reply[replycounter],sizeof(Reply));
ioprintf("\nc7ToUser:> ");
Getstring(reply[replycounter].To,0,50,BUFFERED,0);
if (!(ulong=SearchUser(reply[replycounter].To)))
StrToLong(reply[replycounter].To,(LONG *)&ulong);
if (ulong>0 && ulong<=cport->UL.UserEntrys)
{
reply[replycounter].ToUser=ulong;
if (VisualEditor("ram:temp"))
{
if (data_mulder=Open("ram:temp",MODE_OLDFILE))
{
Seek(data_mulder,0,OFFSET_END);
if (ulong=Seek(data_mulder,0,OFFSET_BEGINNING))
{
if (buffer2=AllocVec(ulong+1,MEMF_ANY))
Read(data_mulder,buffer2,ulong);
Close(data_mulder);
if (buffer2)
{
sprintf(buffer,"%s/data/%s.replys",path,item->itemheader.Path);
if (index_mulder=Open(buffer,MODE_READWRITE))
{
sprintf(buffer,"%s/data/%s.text",path,item->itemheader.Path);
if (data_mulder=Open(buffer,MODE_READWRITE))
{
Seek(data_mulder,0,OFFSET_END);
reply[replycounter].seek=Seek(data_mulder,0,OFFSET_END);
reply[replycounter].length=ulong;
Write(data_mulder,buffer2,ulong);
Close(data_mulder);
}
/*** Adding Username & ID of Creater ***/
reply[replycounter].FromUser=cport->LocalUser.IDNumber;
strcpy(reply[replycounter].From,cport->LocalUser.Handle);
strcpy(reply[replycounter].FromRealName,cport->LocalUser.RealName);
GetTime(&reply[replycounter].CreateDate);
GetTime(&reply[replycounter].LastChange);
/*** End of .data-file is the offset for new subboard-structure ***/
Seek(index_mulder,0,OFFSET_END);
Write(index_mulder,&reply[replycounter],sizeof(Reply));
replycounter++;
Close(index_mulder);
}
else
{
ulong=(LONG)IoErr();
Fault((LONG)ulong,NULL,buffer,FAULT_MAX);
ioprintf("\nCan't open %s. DOS-Error %d: %s\n",path,ulong,buffer);
}
FreeVec(buffer2);
}
else
{
ioprintf("Can't alloc mem for Reply-Text");
}
}
}
else
{
ulong=(LONG)IoErr();
Fault((LONG)ulong,NULL,buffer,FAULT_MAX);
ioprintf("\nCan't open %s. DOS-Error %d: %s\n",path,ulong,buffer);
}
}
}
}
nostdcmd=FALSE;
break;
}
if (nostdcmd)
{
if (strlen(cport->argstring[0]))
{
if (*cport->argstring[0]!='*')
{
StrToLong(cport->argstring[0],(long *)&ulong);ulong--;
if (ulong>=0 && ulong<replycounter)
{
currentreply=ulong;
readmore=TRUE;
}
else
{
if (!StdCommand(cmdid));
ioprintf("\n%s: Unknown command\n",cport->argstring[0]);
readmore=FALSE;
}
}
}
}
}
while (!quit && !cport->ProgramClose && cport->network.online);
if (select)FreeVec(select);
if (reply)FreeVec(reply);
}
}